package day16;

import java.util.concurrent.TimeUnit;

/**
 * @author: 王丹
 * @create: 2021-07-23 11:24
 * 假如有这样一个需求，当我们需要解析一个Excel里多个sheet的数据时，可以考虑使用多线程，
 * 每个线程解析一个sheet里的数据，等到所有的sheet都解析完之后，程序需要统计解析总耗时。
 * 分析一下：解析每个sheet耗时可能不一样，总耗时就是最长耗时的那个操作。
 **/
public class Demo1 {

    /**
     * 运行说明：
     * 代码中启动了2个解析sheet的线程，第一个耗时2秒，第二个耗时5秒，最终结果中总耗时：5秒。
     * 上面的关键技术点是线程的 join()方法，此方法会让当前线程等待被调用的线程完成之后才能继续。
     * 可以看一下join的源码，内部其实是在synchronized方法中调用了线程的wait方法，最后被调用的
     * 线程执行完毕之后，由jvm自动调用其notifyAll()方法，唤醒所有等待中的线程。这个notifyAll()
     * 方法是由jvm内部自动调用的，jdk源码中是看不到的，需要看jvm源码，有兴趣的同学可以去查一下。
     * 所以JDK不推荐在线程上调用wait、notify、notifyAll方法。
     * @param args
     * @throws InterruptedException
     */
    public static void main(String[] args) throws InterruptedException {
        long starTime = System.currentTimeMillis();
        T t1 = new T("解析sheet1线程", 2);
        t1.start();
        T t2 = new T("解析sheet2线程", 5);
        t2.start();
        t1.join();
        t2.join();
        long endTime = System.currentTimeMillis();
        System.out.println("总耗时:" + (endTime - starTime));
    }

    public static class T extends Thread {
        int sleepSeconds;

        public T(String name, int sleepSeconds) {
            super(name);
            this.sleepSeconds = sleepSeconds;
        }

        public void run() {
            Thread ct = Thread.currentThread();
            long startTime = System.currentTimeMillis();
            System.out.println(startTime + "," + ct.getName() + ",开始处理!");

            try {
                TimeUnit.SECONDS.sleep((long)this.sleepSeconds);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            long endTime = System.currentTimeMillis();
            System.out.println(endTime + "," + ct.getName() + ",处理完毕,耗时:" + (endTime - startTime));
        }
    }
}
